home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / net3d-0.08 / net.c < prev    next >
C/C++ Source or Header  |  1995-06-22  |  3KB  |  137 lines

  1. #include "net.h"
  2.  
  3. extern int linenum;        /* also defined in net3d.h, but I don't
  4.                  * want to include that whole file.
  5.                  */
  6.  
  7. /* opens a destination socket and returns it's file descriptor.
  8.  * accept can then be used to wait for incoming connections.
  9.  */
  10. int OpenDest(void)
  11. {
  12. int newsock;
  13. struct sockaddr_in addr={0};
  14.  
  15. /* create an internet socket, on the port defined by NET_PORT */
  16. newsock=socket(AF_INET,SOCK_STREAM,0);
  17. addr.sin_family=AF_INET;
  18. addr.sin_port=NET_PORT;
  19. addr.sin_addr.s_addr=INADDR_ANY;
  20. if (bind(newsock,(struct sockaddr *)&addr,sizeof(addr)) < 0) {
  21.     printf("bind failed! %s\n",strerror(errno));
  22.     printf("The server is probably already running on this machine\n");
  23.     exit(1);
  24.     }
  25.  
  26. /* allow max 8 connections in queue */
  27. listen(newsock,8);
  28. setsockopt(newsock,SOL_SOCKET,SO_REUSEADDR,NULL,0);
  29. return(newsock);
  30. }
  31.  
  32. /* connect to the specified address, and return the file descriptor
  33.  * of that connection.
  34.  */
  35. int OpenSend(char *server)
  36. {
  37. int sock;
  38. struct sockaddr_in addr={0};
  39. struct hostent *dest;
  40. struct in_addr *ip;
  41.  
  42. /* create the sending socket */
  43. sock=socket(AF_INET,SOCK_STREAM,0);
  44.  
  45. /* convert the address to an IP number, and connect to that machine */
  46. addr.sin_family=AF_INET;
  47. addr.sin_port=NET_PORT;
  48. dest=gethostbyname(server);
  49. if (!dest) {
  50.     printf("Error finding machine or file \"%s\"\n",server);
  51.     exit(1);
  52.     }
  53. ip=(struct in_addr *)dest->h_addr;
  54. addr.sin_addr.s_addr=ip->s_addr;
  55. if (connect(sock,(struct sockaddr *)&addr,sizeof(addr)) < 0) {
  56.     printf("Error connecting to machine \"%s\" : %s\n",server,
  57.      strerror(errno));
  58.     exit(2);
  59.     }
  60. return(sock);
  61. }
  62.  
  63. /* writes a formatted stream of characters to a specified socket,
  64.  * in the style of fprintf
  65.  */
  66. void nprintf(int sock, char *fmt, ...)
  67. {
  68. char buf[1200];
  69. va_list ap;
  70.  
  71. va_start(ap,fmt);
  72. vsprintf(buf,fmt,ap);
  73. if (write(sock,buf,strlen(buf)) != strlen(buf)) {
  74.     printf("Error on writing to socket %d : %s\n",sock,strerror(errno));
  75.     exit(5);
  76.     }
  77. va_end(ap);
  78. }
  79.  
  80. /* read one line from the specified socket into an internal static
  81.  * buffer, and return a pointer to it
  82.  */
  83. char *ngets(int sock)
  84. {
  85. static char buf[5000];
  86. char c;
  87. int i=0;
  88.  
  89. do {
  90.     if (read(sock,&c,1) != 1) {
  91.         printf("network read error : %s\n",strerror(errno));
  92.         exit(5);
  93.         }
  94.     if (i < 5000)
  95.         buf[i++]=c;
  96.     else
  97.         printf("ngets buffer overflow!!\n");
  98.     } while(c != '\n');
  99. buf[i-1]='\0';
  100. return(buf);
  101. }
  102.  
  103. /* read one word from the specified socket into an internal static
  104.  * buffer, and returns a pointer to it. Also increments the linenum
  105.  * counter for each \n hit.
  106.  */
  107. char *ngetw(int sock)
  108. {
  109. static char buf[5000];
  110. int i=0;
  111. int rv;
  112.  
  113. /* skip initial whitespaces */
  114. do {
  115.     if ((rv = read(sock,&buf[0],1)) != 1) {
  116.         printf("network read error : %s\n",strerror(errno));
  117.         exit(5);
  118.         }
  119.     if (buf[0] == '\n')
  120.         linenum++;
  121.     } while((buf[0]=='\n' || buf[0]==' ' || buf[0]=='\t') && rv);
  122.  
  123. /* read a word up to a whitespace */
  124. while(buf[i] != '\n' && buf[i] != ' ' && buf[i] != '\t' && rv) {
  125.     i++;
  126.     if ((rv=read(sock,buf+i,1)) != 1) {
  127.         printf("network read error : %s\n",strerror(errno));
  128.         exit(5);
  129.         }
  130.     if (buf[i] == '\n')
  131.         linenum++;
  132.     }
  133. buf[i]='\0';
  134. return(buf);
  135. }
  136.  
  137.